﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.HtmlControls;
using System.Web;
using System.IO;

namespace CRM.Common
{
    #region 文件上传的通用类
    /// <summary>
    /// 文件上传通用类
    /// </summary>
    public class UploadFile
    {
        #region 是否允许该扩展名上传IsAllowedExtension
        /// <summary>
        /// 是否允许该扩展名上传
        /// </summary>
        /// <param name="hifile">HtmlInputFile控件</param>
        /// <returns>允许则返回true,否则返回false</returns>
        public bool IsAllowedExtension(HtmlInputFile hifile)
        {

            string strOldFilePath = "";

            string strExtension = "";

            //允许上传的扩展名，可以改成从配置文件中读出 

            string[] arrExtension = { ".gif", ".jpg", ".jpeg", ".bmp", ".png" };

            if (hifile.PostedFile.FileName != string.Empty)
            {

                strOldFilePath = hifile.PostedFile.FileName;

                //取得上传文件的扩展名 

                strExtension = strOldFilePath.Substring(strOldFilePath.LastIndexOf("."));

                //判断该扩展名是否合法 

                for (int i = 0; i < arrExtension.Length; i++)
                {

                    if (strExtension.ToLower().Equals(arrExtension[i]))
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        /// <summary>
        /// 是否允许该扩展名上传
        /// </summary>
        /// <param name="hifile">客户端文件上传的路径</param>
        /// <returns>允许则返回true,否则返回false</returns>
        public bool IsAllowedExtension(HttpPostedFileBase hifile)
        {

            string strOldFilePath = "";

            string strExtension = "";

            //允许上传的扩展名，可以改成从配置文件中读出 
            string[] arrExtension = { ".gif", ".jpg", ".jpeg", ".bmp", ".png" };

            if (hifile.FileName != string.Empty)
            {

                strOldFilePath = hifile.FileName;

                //取得上传文件的扩展名 

                strExtension = strOldFilePath.Substring(strOldFilePath.LastIndexOf("."));

                //判断该扩展名是否合法 

                for (int i = 0; i < arrExtension.Length; i++)
                {

                    if (strExtension.ToLower().Equals(arrExtension[i]))
                    {

                        return true;

                    }

                }

            }

            return false;

        }

        /// <summary>
        /// 是否允许该扩展名上传
        /// </summary>
        /// <param name="hifile">客户端文件上传的路径</param>
        /// <returns>允许则返回true,否则返回false</returns>
        public bool IsAllowedExtension(HttpPostedFile hifile)
        {

            string strOldFilePath = "";

            string strExtension = "";

            //允许上传的扩展名，可以改成从配置文件中读出 
            string[] arrExtension = { ".gif", ".jpg", ".jpeg", ".bmp", ".png" };

            if (hifile.FileName != string.Empty)
            {

                strOldFilePath = hifile.FileName;

                //取得上传文件的扩展名 

                strExtension = strOldFilePath.Substring(strOldFilePath.LastIndexOf("."));

                //判断该扩展名是否合法 

                for (int i = 0; i < arrExtension.Length; i++)
                {

                    if (strExtension.ToLower().Equals(arrExtension[i]))
                    {

                        return true;

                    }

                }

            }

            return false;

        }


        #endregion
        #region 判断上传文件大小是否超过最大值IsAllowedLength

        /// <summary> 

        /// 判断上传文件大小是否超过最大值 

        /// </summary> 

        /// <param name="hifile">HtmlInputFile控件</param> 

        /// <returns>超过最大值返回false,否则返回true.</returns> 
        public bool IsAllowedLength(HtmlInputFile hifile)
        {

            //允许上传文件大小的最大值,可以保存在xml文件中,单位为KB 

            int i = 20;

            //如果上传文件的大小超过最大值,返回flase,否则返回true. 

            if (hifile.PostedFile.ContentLength > i * 1024)
            {

                return false;

            }

            return true;

        }

        /// <summary> 

        /// 判断上传文件大小是否超过最大值 

        /// </summary> 

        /// <param name="hifile">HttpPostedFile控件</param> 

        /// <returns>超过最大值返回false,否则返回true.</returns> 
        public bool IsAllowedLength(HttpPostedFileBase hifile)
        {

            //允许上传文件大小的最大值,可以保存在xml文件中,单位为KB 

            int i = 20;

            //如果上传文件的大小超过最大值,返回flase,否则返回true. 

            if (hifile.ContentLength > i * 1024)
            {

                return false;

            }

            return true;

        }

        /// <summary> 

        /// 判断上传文件大小是否超过最大值 

        /// </summary> 

        /// <param name="hifile">HttpPostedFile控件</param> 

        /// <returns>超过最大值返回false,否则返回true.</returns> 
        public bool IsAllowedLength(HttpPostedFile hifile)
        {

            //允许上传文件大小的最大值,可以保存在xml文件中,单位为KB 

            int i = 20;

            //如果上传文件的大小超过最大值,返回flase,否则返回true. 

            if (hifile.ContentLength > i * 1024)
            {

                return false;

            }

            return true;

        }
        #endregion
        #region 获取一个不重复的文件名GetUniqueString

        /// <summary> 

        /// 获取一个不重复的文件名 

        /// </summary> 

        /// <returns></returns> 
        public static string GetUniqueString()
        {

            //得到的文件名形如：20050922101010+三位的随机数 
            return DateTime.Now.ToString("yyyyMMddhhmmss") + new Random().Next(0, 1000).ToString();

        }

        #endregion

        #region 删除指定文件DeleteFile

        /// <summary> 

        /// 删除指定文件 

        /// </summary> 

        /// <param name="strAbsolutePath">文件绝对路径</param> 

        /// <param name="strFileName">文件名</param> 
        public void DeleteFile(string strAbsolutePath, string strFileName)
        {

            //判断路径最后有没有\符号，没有则自动加上 

            if (strAbsolutePath.LastIndexOf("\\") == strAbsolutePath.Length)
            {

                //判断要删除的文件是否存在 

                if (File.Exists(strAbsolutePath + strFileName))
                {

                    //删除文件 

                    File.Delete(strAbsolutePath + strFileName);

                }

            }

            else
            {

                if (File.Exists(strAbsolutePath + "\\" + strFileName))
                {

                    File.Delete(strAbsolutePath + "\\" + strFileName);

                }

            }

        }

        #endregion

        #region 上传文件并返回文件名 SaveFile

        /// <summary> 

        /// 上传文件并返回文件名 

        /// </summary> 

        /// <param name="hifile">HtmlInputFile控件</param> 

        /// <param name="strAbsolutePath">绝对路径.如:Server.MapPath(@"Image/upload")与Server.MapPath(@"Image/upload/")均可,用\符号亦可</param> 

        /// <returns>返回的文件名即上传后的文件名</returns> 

        public string SaveFile(HtmlInputFile hifile, string strAbsolutePath)
        {

            string strOldFilePath = "", strExtension = "", strNewFileName = "";




            //如果上传文件的文件名不为空 

            if (hifile.PostedFile.FileName != string.Empty)
            {

                strOldFilePath = hifile.PostedFile.FileName;

                //取得上传文件的扩展名 

                strExtension = strOldFilePath.Substring(strOldFilePath.LastIndexOf("."));

                //文件上传后的命名 

                strNewFileName = GetUniqueString() + strExtension;

                //如果路径末尾为\符号，则直接上传文件 

                if (strAbsolutePath.LastIndexOf("\\") == strAbsolutePath.Length)
                {

                    hifile.PostedFile.SaveAs(strAbsolutePath + strNewFileName);

                }

                else
                {

                    hifile.PostedFile.SaveAs(strAbsolutePath + "\\" + strNewFileName);

                }

            }

            return strNewFileName;
        }

        /// <summary> 

        /// 上传文件并返回文件名 

        /// </summary> 

        /// <param name="hifile">HttpPostedFile上传的文件</param> 

        /// <param name="strAbsolutePath">绝对路径.如:Server.MapPath(@"Image/upload")与Server.MapPath(@"Image/upload/")均可,用\符号亦可</param> 

        /// <returns>返回的文件名即上传后的文件名</returns> 
        public string SaveFile(HttpPostedFile hifile, string strAbsolutePath)
        {

            string strOldFilePath = "", strExtension = "", strNewFileName = "";

            //如果上传文件的文件名不为空 

            if (hifile.FileName != string.Empty)
            {

                strOldFilePath = hifile.FileName;

                //取得上传文件的扩展名 

                strExtension = strOldFilePath.Substring(strOldFilePath.LastIndexOf("."));

                //文件上传后的命名 

                strNewFileName = GetUniqueString() + strExtension;

                //如果路径末尾为\符号，则直接上传文件 

                if (strAbsolutePath.LastIndexOf("\\") == strAbsolutePath.Length)
                {
                    hifile.SaveAs(strAbsolutePath + strNewFileName);
                }

                else
                {

                    hifile.SaveAs(strAbsolutePath + "\\" + strNewFileName);

                }

            }

            return strNewFileName;

        }

        /// <summary>
        /// MVC中文件的保存
        /// </summary>
        /// <param name="hifile"></param>
        /// <param name="strAbsolutePath"></param>
        /// <returns></returns>
        public string SaveFile(HttpPostedFileBase hifile, string strAbsolutePath)
        {
            string strOldFilePath = "", strExtension = "", strNewFileName = "";

            //如果上传文件的文件名不为空 

            if (hifile.FileName != string.Empty)
            {
                strOldFilePath = hifile.FileName;

                //取得上传文件的扩展名 
                strExtension = strOldFilePath.Substring(strOldFilePath.LastIndexOf("."));

                //文件上传后的命名 
                strNewFileName = GetUniqueString() + strExtension;

                //如果路径末尾为\符号，则直接上传文件 
                if (strAbsolutePath.LastIndexOf("\\") == strAbsolutePath.Length)
                {
                    hifile.SaveAs(strAbsolutePath + strNewFileName);
                }
                else
                {
                    hifile.SaveAs(strAbsolutePath + "/" + strNewFileName);
                }
            }
            return strNewFileName;
        }
        #endregion
        #region 重新上传文件，删除原有文件CoverFile

        /// <summary> 

        /// 重新上传文件，删除原有文件 

        /// </summary> 

        /// <param name="ffFile">HtmlInputFile控件</param> 

        /// <param name="strAbsolutePath">绝对路径.如:Server.MapPath(@"Image/upload")与Server.MapPath(@"Image/upload/")均可,用\符号亦可</param> 

        /// <param name="strOldFileName">旧文件名</param> 

        public void CoverFile(HtmlInputFile ffFile, string strAbsolutePath, string strOldFileName)
        {

            //获得新文件名 

            string strNewFileName = GetUniqueString();




            if (ffFile.PostedFile.FileName != string.Empty)
            {

                //旧图片不为空时先删除旧图片 

                if (strOldFileName != string.Empty)
                {

                    DeleteFile(strAbsolutePath, strOldFileName);

                }

                SaveFile(ffFile, strAbsolutePath);

            }

        }

        /// <summary> 

        /// 重新上传文件，删除原有文件 

        /// </summary> 

        /// <param name="ffFile">HtmlInputFile控件</param> 

        /// <param name="strAbsolutePath">绝对路径.如:Server.MapPath(@"Image/upload")与Server.MapPath(@"Image/upload/")均可,用\符号亦可</param> 

        /// <param name="strOldFileName">旧文件名</param> 

        public void CoverFile(HttpPostedFile ffFile, string strAbsolutePath, string strOldFileName)
        {
            //获得新文件名 

            string strNewFileName = GetUniqueString();

            if (ffFile.FileName != string.Empty)
            {

                //旧图片不为空时先删除旧图片 

                if (strOldFileName != string.Empty)
                {

                    DeleteFile(strAbsolutePath, strOldFileName);

                }

                SaveFile(ffFile, strAbsolutePath);

            }
        }

        /// <summary>
        /// MVC中的文件的覆盖
        /// </summary>
        /// <param name="ffFile"></param>
        /// <param name="strAbsolutePath"></param>
        /// <param name="strOldFileName"></param>
        public void CoverFile(HttpPostedFileBase ffFile, string strAbsolutePath, string strOldFileName)
        {
            //获得新文件名 

            string strNewFileName = GetUniqueString();

            if (ffFile.FileName != string.Empty)
            {

                //旧图片不为空时先删除旧图片 

                if (strOldFileName != string.Empty)
                {

                    DeleteFile(strAbsolutePath, strOldFileName);

                }

                SaveFile(ffFile, strAbsolutePath);

            }
        }

        #endregion
    }
    #endregion
}
